package com.server.rule;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import com.server.store.rule.DmAsXml;
/**
 * Singleton de gestion des {@link DecisionMaker} suivant le pattern Flyweight
 * @author queyroi
 *
 */
public class DecisionMakerManager {

	private static DecisionMakerManager instance = new DecisionMakerManager();
	/**
	 * Pool de {@link DecisionMaker} en mémoire
	 */
	private Map<String,DecisionMaker> pool = new HashMap<String, DecisionMaker>();
	private static final String path = "dmfiles/";
	
	private DecisionMakerManager() {}
	/**
	 * Méthode renvoyant le {@link DecisionMaker} du meme nom. Charge en mémoire si absent de la pool.
	 * @param nomDM nom du {@link DecisionMaker}
	 * @return {@link DecisionMaker} à charger
	 * @throws JDOMException
	 * @throws IOException
	 */
	public DecisionMaker getDM(String nomDM) throws JDOMException, IOException{		
		if(pool.get(nomDM)==null) pool.put(nomDM, DecisionMakerFactory.get().load(nomDM));
		return pool.get(nomDM);
	}
	/**
	 * Méthode pour liste les fichier disponible dans le path
	 * @return
	 */
	public List<String> availableDM(){
		List<String> listeReturn = new ArrayList<String>();		
		File dir = new File(path);
		String[] files = dir.list();
		
		if(files!=null){
			for(String f : files){
				if(f.substring(f.length()-3).equals("xml")) listeReturn.add(f.substring(0, f.length()-4));
			}
		}
		for(DmAsXml dm : DecisionMakerFactory.get().getStore().getList()){
			if(!listeReturn.contains(dm)) listeReturn.add(dm.getName());
		}
		return listeReturn;
	}
	/**
	 * Méthode renvoyant le {@link DecisionMaker} sous format xml en vue de l'édition
	 * @param nomDM nom du {@link DecisionMaker} à charger
	 * @return
	 * @throws JDOMException
	 * @throws IOException
	 */
	public String getDMasString(String nomDM) throws JDOMException, IOException{
		
		Document document = new Document(getDM(nomDM).getXMLElement());	
		XMLOutputter output = new XMLOutputter(Format.getRawFormat());
		
		
		return output.outputString(document);		
	}
	
	/**
	 * Méthode pour l'enregistrement des système de décision dans le Datastore
	 * Suppression du {@link DecisionMaker} de la pool.
	 * @param nomDM nom du systeme à sauver
	 * @param contents le contenu xml
	 * @throws NullPointerException
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void saveDM(String nomDM,String contents) throws NullPointerException, JDOMException, IOException{
		pool.remove(nomDM);
		DecisionMakerFactory.get().saveAsXML(nomDM, contents);
	}
	
	/**
	 * @return the instance
	 */
	public final synchronized static DecisionMakerManager get() {
		return instance;
	}
	
	
}
